package cn.cdutetc.library.service;

import cn.cdutetc.library.entity.pojo.User;
import cn.cdutetc.library.entity.dto.UserCreateDTO;
import cn.cdutetc.library.entity.dto.UserLoginDTO;
import cn.cdutetc.library.entity.dto.UserUpdateDTO;
import cn.cdutetc.library.entity.dto.UserVO;
import cn.cdutetc.library.entity.dto.UserExportDTO;
import cn.cdutetc.library.entity.dto.LoginResponseDTO;
import cn.cdutetc.library.entity.dto.UserImportDTO;
import cn.cdutetc.library.entity.dto.UserImportTemplateDTO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;

import jakarta.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 用户服务接口
 */
public interface UserService extends IService<User> {
    
    /**
     * 用户登录
     * @param loginDTO 登录信息
     * @return 登录响应信息（包含token和权限）
     */
    LoginResponseDTO login(UserLoginDTO loginDTO);
    
    /**
     * 创建用户
     * @param createDTO 用户创建信息
     * @return 用户ID
     */
    Integer createUser(UserCreateDTO createDTO);
    
    /**
     * 更新用户
     * @param updateDTO 用户更新信息
     * @return 是否成功
     */
    boolean updateUser(UserUpdateDTO updateDTO);
    
    /**
     * 删除用户
     * @param userId 用户ID
     * @return 是否成功
     */
    boolean deleteUser(Integer userId);
    
    /**
     * 获取用户详情
     * @param userId 用户ID
     * @return 用户信息
     */
    UserVO getUserById(Integer userId);
    
    /**
     * 分页查询用户
     * @param page 页码
     * @param size 每页大小
     * @param keyword 关键字
     * @param role 角色筛选
     * @param status 状态筛选
     * @return 用户分页列表
     */
    IPage<UserVO> pageUsers(Integer page, Integer size, String keyword, String role, String status);
    
    /**
     * 修改密码
     * @param userId 用户ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 是否成功
     */
    boolean changePassword(Integer userId, String oldPassword, String newPassword);
    
    /**
     * 重置密码
     * @param userId 用户ID
     * @return 新密码
     */
    String resetPassword(Integer userId);
    
    /**
     * 导出用户数据到Excel
     * @param response HTTP响应
     * @param keyword 搜索关键字
     */
    void exportUsers(HttpServletResponse response, String keyword);
    
    /**
     * 下载用户导入模板
     * @param response HTTP响应
     */
    void downloadImportTemplate(HttpServletResponse response);
    
    /**
     * 从Excel导入用户数据
     * @param file Excel文件
     * @return 导入结果信息
     */
    String importUsers(MultipartFile file);
    
    /**
     * 查询读者列表（角色为normal_user的用户）
     * @param page 页码
     * @param size 每页大小
     * @param keyword 关键字
     * @return 读者分页列表
     */
    IPage<UserVO> pageReaders(Integer page, Integer size, String keyword);
    
    /**
     * 获取所有读者列表
     * @param keyword 关键字
     * @return 读者列表
     */
    List<UserVO> getAllReaders(String keyword);
    
    /**
     * 导出读者数据到Excel（仅导出normal_user角色用户）
     * @param response HTTP响应
     * @param keyword 搜索关键字
     */
    void exportReaders(HttpServletResponse response, String keyword);
}